package java0819;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class ThreadDemo28 {
    static class Worker extends Thread{
        private BlockingQueue<Runnable> queue = null;

        public Worker(BlockingQueue<Runnable> queue){
            this.queue = queue;
        }
        @Override
        public void run() {
            //工作线程的具体逻辑
            //需要从阻塞队列中取任务
            while (true){
                try {
                    Runnable command = queue.take();
                    //通过run来执行这个具体的任务
                    command.run();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    static class ThreadPool{
        //包含一个阻塞队列，用来组织任务
        private BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();

        //这个list就用来存放当前的工作线程
        private List<Thread> workers = new ArrayList<>();

        private static final int MAX_WORHKER_COUNT = 10;

        //通过这个方法，把任务加入到线程池中
        //submit不仅可以把任务放到阻塞队列中，同时也可以负责创建线程
        public void submit(Runnable command){
            if (workers.size() < MAX_WORHKER_COUNT){
                //如果当前工作线程的数量不足线程数目上限，就创建出新的线程
                //工作线程就专门搞一个类来完成
                //work内部要能够取到队列的内容，就需要把这个队列实例通过Work 的工作方法传过去
                Worker worker = new Worker(queue);
                worker.start();
                workers.add(worker);
            }
            queue.offer(command);

        }
    }
    public static void main(String[] args) {
        ThreadPool pool = new ThreadPool();
        for (int i = 0; i < 10; i++){
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello");
                }
            });
        }
    }
}
